/**
 * 类型转换 和 static_cast
 * 
 * 当编译器在没有我们明确询问的情况下代表我们进行类型转换时，我们称之为隐式类型转换。
 * 
 * 类型转换产生新值
 * 尽管称为转换，但类型转换实际上不会更改值或被转换值的类型。相反，要转换的值用作输入，转换结果会生成目标类型的新值（通过直接初始化）。
 * 
 * 类型转换使用直接初始化从不同类型的值生成目标类型的新值。
 * 
 * 某些类型转换始终是安全的（例如int to double），而其他类型转换可能会导致值在转换期间发生更改（例如double to int）。不安全的隐式转换通常会生成编译器警告，或者（在大括号初始化的情况下）生成错误。
 * 这是大括号初始化成为首选初始化形式的主要原因之一。大括号初始化将确保我们不会尝试使用初始化器来初始化变量，该初始化器在隐式类型转换时会丢失值：
 *     double d { 5 }; // okay: int to double is safe
 *     int x { 5.5 }; // error: double to int not safe
 * 
 * 
 * 显示类型转换
 * static_cast<new_type>(expression)
 * static_cast 将表达式中的值作为输入，并返回转换为new_type指定的类型（例如 int、bool、char、double）的值。
 * 
 * 每当您看到使用尖括号 (<>) 的 C++ 语法（不包括预处理器）时，尖括号之间的内容很可能是一种类型。这通常是 C++ 处理需要参数化类型的代码的方式。
 * 
 * static_cast的参数计算为表达式。当我们传入一个变量时，该变量将被计算以产生它的值，然后该值被转换为新类型。变量本身不会因为将其值转换为新类型而受到影响。
 * 
 * static_cast运算符不执行任何范围检查，因此如果将值转换为范围不包含该值的类型，则会导致未定义的行为。因此，如果 的值大于有符号可容纳的最大值，则上述从unsigned int到 的转换将产生不可预测的结果。
 * 如果要转换的值不适合新类型的范围，static_cast 运算符将产生未定义的行为。
 * 
 */

#include <iostream>

void print(double x) // print takes a double parameter
{
	std::cout << x << '\n';
}

int main()
{
	int y { 5 };
	print(y); // y is of type int


    print(static_cast<double>(5)); // explicitly convert int value 5 to an double


    char ch{ 97 }; // 97 is ASCII code for 'a'
    std::cout << ch << '\n';
    std::cout << static_cast<int>(ch) << "\n";

	return 0;
}